package action

import java.util.concurrent.{Callable, ExecutorService, LinkedBlockingQueue}

import Utils.{DelayUtil, ProbUtil}
import beans._
import org.apache.commons.lang3.RandomUtils

/**
  * Created by hunter.coder 涛哥  
  * 2019/2/11 10:55
  * 交流qq:657270652
  * Version: 1.0
  * 更多学习资料：https://blog.csdn.net/coderblack/
  * Description: 用户行为流程控制
  **/
class ActionController(val user: UserBean, val uq: LinkedBlockingQueue[UserBean] = null, speed: Double = 1) extends Callable[Boolean] {

  override def call(): Boolean = {

    val actionEntities = new ActionEntities(user)
    val beginTime = System.currentTimeMillis()

    // 全局页面列表
    val pages = Page.getPagList()

    // 广告页面上的商品项
    val adItems = Page.getAdItems(pages)


    // 启动
    val indexPage = actionEntities.startup()
    DelayUtil.delaySeconds(speed)

    //循环操作
    var actionProb = RandomUtils.nextInt(60, 95)
    var prePageUrl = indexPage.pgUrl
    // 用户以给定概率来循环
    while (ProbUtil.probilityDo(actionProb)) {
      // 概率递减
      actionProb = actionProb - 1

      // 非注册用户在操作过程中有50%可能会注册
      if (ProbUtil.probilityDo(50) && !user.isRegistered) {
        actionEntities.regist()
        DelayUtil.delaySeconds(speed)
      }

      var curpg: Page = null // 记录当前正在操作的页面

      // 50%几率会搜索课程
      if (ProbUtil.probilityDo(50)) {
        actionEntities.search(curpg)
        Thread.sleep(DelayUtil.delaySeconds(speed))
        // 搜索之后，有50%几率浏览所搜索的页面课程
        curpg = actionEntities.viewPg(pages.values.toList, prePageUrl)
        prePageUrl = curpg.pgUrl // 将本次url作为下一次的refurl
        Thread.sleep(DelayUtil.delayMinutes(speed))
      }

      // 或以50%几率直接浏览课程
      curpg = actionEntities.viewPg(pages.values.toList, prePageUrl)
      prePageUrl = curpg.pgUrl // 将本次url作为下一次的refurl
      Thread.sleep(DelayUtil.delayMinutes(speed))


      //  30%几率在本页面上继续搜索课程
      if (ProbUtil.probilityDo(30)) {
        actionEntities.search(curpg)
        Thread.sleep(DelayUtil.delayMinutes(speed))
      }


      //  浏览页面时，有20%几率点击广告
      if (ProbUtil.probilityDo(20)) {
        actionEntities.clickAd(curpg, pages, adItems)
        Thread.sleep(DelayUtil.delaySeconds(speed))
      }


      //  浏览页面时，有20%几率点击活动
      if (ProbUtil.probilityDo(30)) {
        actionEntities.clickAct(curpg, pages)  // 内含：以一定几率参与活动
        Thread.sleep(DelayUtil.delaySeconds(speed))
      }


      //  喜欢、收藏课程
      if (ProbUtil.probilityDo(25)) {

        // 非注册用户在操作过程中有50%可能会注册（登录）
        if (!user.isRegistered) {
          actionEntities.regist()
          DelayUtil.delaySeconds(speed)
        }

        actionEntities.favor(curpg)
        Thread.sleep(DelayUtil.delaySeconds(speed))
      }

      //  点赞商品
      var isThumbup = false
      if (ProbUtil.probilityDo(18)) {
        actionEntities.thumbup(curpg)
        isThumbup = true
        Thread.sleep(DelayUtil.delaySeconds(speed))
      }

      //  添加购物车
      if (ProbUtil.probilityDo(25)) {


        // 非注册用户在操作过程中有50%可能会注册（登录）
        if (!user.isRegistered) {
          actionEntities.regist()
          DelayUtil.delaySeconds(speed)
        }

        actionEntities.addCart(curpg)
        Thread.sleep(DelayUtil.delayMinutes(speed))
      }


      // 提交订单
      if (ProbUtil.probilityDo(25)) {
        actionEntities.subOrder(curpg,pages)
        DelayUtil.delaySeconds(speed)

      }


      //  给课程评分
      if (ProbUtil.probilityDo(18)) {


        // 非注册用户在操作过程中有50%可能会注册（登录）
        if (!user.isRegistered) {
          actionEntities.regist()
          DelayUtil.delaySeconds(speed)
        }

        actionEntities.rate(curpg, isThumbup)
        Thread.sleep(DelayUtil.delayMinutes(speed))
      }
    }
    // 结束后：选择是否更新用户的：  位置、手机、app数据
    user.changeLoc()
    user.changeApp()
    user.changePhone()

    // 将用户放回队列
    if (uq != null) {
      uq.add(user)
    }
    true
  }


}

object ActionController {
  def main(args: Array[String]): Unit = {

    val user: UserBean = ProbUtil.userBean
    val controller = new ActionController(user)
    controller.call()
  }
}
